﻿import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { history } from '@umijs/max';
import { message } from 'antd';
// const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/user/login';

// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  errno: number;
  message: string;
  status: number;
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res) => {
      console.log(res);
      const { success, message, status } = res as unknown as ResponseStructure;

      if (!success) {
        const error: any = {};
        // console.log(error);
        error.name = 'BizError';
        error.info = { success, message, status };
        throw error; // 抛出自制的错误
      }
    },
    // 错误接收及处理
    errorHandler: (error: any, opts: any) => {
      // console.log(error,opts);
      if (opts?.skipErrorHandler) throw error;
      // 我们的 errorThrower 抛出的错误。
      if (error.name === 'BizError') {
        const errorInfo: ResponseStructure | undefined = error.info;
        if (errorInfo) {
          if (!errorInfo.success) {
            message.error(errorInfo.message);
          }
        }
      } else if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围

        if (error.response.status === 401) {
          // message.error('用户授权过期，需重新登录')
          history.push(loginPath);
        } else {
          message.error(`Response status:${error.response.status}`);
        }
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        message.error('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        message.error('Request error, please retry.');
      }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      // console.log(config);
      const token = localStorage.getItem('token');
      // console.log(token)
      let authHeader = {};
      const urlLogin = '/admin/login/ajaxLogin';

      if (config.url?.indexOf(urlLogin) === -1) {
        if (token !== null) {
          authHeader = { Token: `${token}` };
        }
      }
      let url = `${config.url}`;
      if (config.url?.indexOf('/apiupload') === -1) {
        url = `/api${config.url}`;
      }
      // console.log(url)
      return { ...config, url, headers: authHeader };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // console.log(response);
      // // 拦截响应数据，进行个性化处理
      // const { data } = response as unknown as ResponseStructure;
      // console.log(data)
      // if (data.status !== 0) {
      //   message.error(data.message);
      // }
      // response.data = data.data;
      return response;
    },
  ],
};
